﻿
#ifndef _ALITTLE_NETSYSTEM_H_
#define _ALITTLE_NETSYSTEM_H_

#include <ALittleClient/ThreadSystem/Task.h>

#include <SDL2/SDL_net.h>

#include <vector>

#include "SendThread.h"
#include "ReceiveThread.h"
#include "Message.h"

namespace ALittle
{

class NetSystem : public Task
{
public:
	static NetSystem& Instance();

public:
	void Setup();
	void Shutdown();
	void RegisterToScript();

public:
	enum ConnectState
	{
		CONNECT_IDLE,			// 空闲
		CONNECT_ED,				// 已连接
		CONNECT_ING				// 正在连接
	};
	// 执行
	void Execute();
	// 放弃
	void Abandon();

public:
	// 连接
	void Connect(const char* ip, unsigned int port);
	// 关闭连接
	void Close();

public:
	// 设置回调函数
	typedef void (*HandleMessage)(void* body_memory);
	void SetMessageCallBack(unsigned int message_id, HandleMessage func);

public:
	// 处理连接成功事件
	void HandleConnectSucceedEvent(void* data);
	// 处理连接失败事件
	void HandleConnectFailedEvent(void* data);
	// 处理断开连接事件
	void HandleDisconnectEvent(void* data);
	// 处理消息包事件
	void HandleMessageEvent(void* head_memory);

public:
	// 发送消息包
	void Send(const Message& message);

public:
	// 处理JsonCall
	static void HandleJsonCall(void* body_memory);
	// 发送JsonCall
	void SendJsonCall(const char* method, const char* arg);
	// 发送脚本注入
	void SendRunScript(const char* script);

private:
	// TCP socket
	TCPsocket m_socket;

private:
	// 发送器
	SendThread* m_send_thread;
	// 接收器
	ReceiveThread* m_receive_thread;

private:
	ConnectState m_state;		// 连接状态
	std::string m_ip;			// ip地址
	unsigned int m_port;		// 端口

private:
	// 消息处理回调函数
	typedef std::vector<HandleMessage> HandleList;
	HandleList m_handle_list;

private:
	NetSystem();
	~NetSystem();
};

} // ALittle

#define g_NetSystem ALittle::NetSystem::Instance()

#endif // _ALITTLE_NETSYSTEM_H_